package chapter013;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式
 * + 号代表前面的字符必须至少出现一次（1次或多次）
 * * 号代表前面的字符可以不出现，也可以出现一次或者多次（0次、或1次、或多次）
 * ? 问号代表前面的字符最多只可以出现一次（0次、或1次）
 * [ABC] 匹配 [...] 中的所有字符，例如 [aeiou] 匹配字符串 "google runoob taobao" 中所有的 e o u a 字母。
 * [^ABC] 匹配除了 [...] 中字符的所有字符，例如 [^aeiou] 匹配字符串 "google runoob taobao" 中除了 e o u a 字母的所有字母。
 * [A-Z] [A-Z] 表示一个区间，匹配所有大写字母，[a-z] 表示所有小写字母。
 * .  匹配除换行符（\n、\r）之外的任何单个字符，相等于 [^\n\r]。
 * [\s\S] 	匹配所有。\s 是匹配所有空白符，包括换行，\S 非空白符，包括换行。
 * \w  匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
 *
 * $	匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。
 * ( )	标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。
 * *	匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。
 * +	匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。
 * .	匹配除换行符 \n 之外的任何单字符。要匹配 . ，请使用 \. 。
 * [	标记一个中括号表达式的开始。要匹配 [，请使用 \[。
 * ?	匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。
 * \	将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。
 * ^	匹配输入字符串的开始位置，除非在方括号表达式中使用，当该符号在方括号表达式中使用时，表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身，请使用 \^。
 * {	标记限定符表达式的开始。要匹配 {，请使用 \{。
 * |	指明两项之间的一个选择。要匹配 |，请使用 \|。
 * *	匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
 * +	匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
 * ?	匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
 * {n}	n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。
 * {n,}	n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
 * {n,m}	m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
 *
 * ^	匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性，^ 还会与 \n 或 \r 之后的位置匹配。
 * $	匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性，$ 还会与 \n 或 \r 之前的位置匹配。
 * \b	匹配一个单词边界，即字与空格间的位置。
 * \B	非单词边界匹配。
 *
 * 参考链接:
 * 菜鸟教程 [Java 正则表达式] https://www.runoob.com/java/java-regular-expressions.html
 * 菜鸟教程 [正则表达式]  https://www.runoob.com/regexp/regexp-syntax.html
 *
 * @author Jack魏
 */
public class Point01 {
    public static void main(String[] args) {
        String content = "I am noob " +
                "from runoob.com.";

        String pattern = ".*runoob*.";

        boolean isMatch = Pattern.matches(pattern, content);
        System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);


        // 按指定模式在字符串查找
        String line = "This order was placed for QT3000! OK?";
        pattern = "(\\D*)(\\d+)(.*)";

        // 创建 Pattern 对象
        Pattern r = Pattern.compile(pattern);

        // 现在创建 matcher 对象
        Matcher m = r.matcher(line);
        if (m.find( )) {
            System.out.println("Found value: " + m.group(0) );
            System.out.println("Found value: " + m.group(1) );
            System.out.println("Found value: " + m.group(2) );
            System.out.println("Found value: " + m.group(3) );
        } else {
            System.out.println("NO MATCH");
        }
    }
}
